package com.example.leetcode.c1_c100.c61;
/**
 * 给定一个链表，旋转链表，将链表每个节点向右移动 k 个位置，其中 k 是非负数。
 *
 * 示例 1:
 *
 * 输入: 1->2->3->4->5->NULL, k = 2
 * 输出: 4->5->1->2->3->NULL
 * 解释:
 * 向右旋转 1 步: 5->1->2->3->4->NULL
 * 向右旋转 2 步: 4->5->1->2->3->NULL
 * 示例 2:
 *
 * 输入: 0->1->2->NULL, k = 4
 * 输出: 2->0->1->NULL
 * 解释:
 * 向右旋转 1 步: 2->0->1->NULL
 * 向右旋转 2 步: 1->2->0->NULL
 * 向右旋转 3 步: 0->1->2->NULL
 * 向右旋转 4 步: 2->0->1->NULL
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/rotate-list
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

import com.example.leetcode.common.ListNode;
import com.example.leetcode.common.ListOperate;

/**
 * 旋转链表
 * @author zhanpengguo
 * @date 2020-09-15 16:35
 */
public class Solution {

    public ListNode rotateRight(ListNode head, int k) {
        if (head == null) {
            return head;
        }
        // 计算链表长度len
        int len = 1;
        ListNode newNode = head;
        while (newNode.next != null) {
            len++;
            newNode = newNode.next;
        }
        // 组成环形链表
        newNode.next = head;
        // 在第k个位置断开
        // 新链表的头位置是k+1，尾位置是k
        // 如果k>len，则k = len-(k % len)
        int index = len - k % len;
        for (int i = 1; i < index; i++) {
            head = head.next;
        }
        ListNode res = head.next;
        head.next = null;
        return res;
    }

    public static void main(String[] args) {
        ListNode head = ListOperate.create(new int[]{0, 1, 2});
        Solution solution = new Solution();
        ListNode node = solution.rotateRight(head, 4);
        while (node != null) {
            System.out.print(node.val);
            node = node.next;
        }
    }
}
